import java.io.FileInputStream;
import java.awt.Window;
import java.io.ObjectInputStream;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import org.apache.torque.TorqueException;
import org.apache.torque.util.Criteria;

import torque.generated.*;

public class Controleur {

	private VueMenuJeu vMenu;
	
	public Controleur() throws Exception{
		vMenu = new VueMenuJeu(this);
	}
	
	public static GregorianCalendar dateToCalendar(Date date) {
		GregorianCalendar gDate = new GregorianCalendar();
	    gDate.setTime(date);
		return gDate;
	}
	
	public boolean loiReussite(){
		Double valeurAleatoire = Math.random();
		if (valeurAleatoire <= 0.80){
			return true;
		}
		else
			return false;
	}

	public void sauvVaisseau(Vaisseau vaisseau) throws Exception {
		vaisseau.save();
	}
	
	public void supprVaisseau(String nomv) throws TorqueException {
		VaisseauPeer Vaisseaux = new VaisseauPeer();
		Vaisseaux.supprVaisseau(nomv);
		IO.Message("Le vaisseau a été correctement supprimé");
	}


	public void supprPartiesVaisseau(List<Partie> partiesASuppr) throws TorqueException {
		PartiePeer parties = null;
		parties.supprPartiesVaisseau(partiesASuppr);
		System.out.println("Les parties ou le vaisseau est présent ont été supprimées");
	}


	public void supprPositionsVaisseau(String nomp) throws TorqueException {
		PositionvaisseauPeer positions = null;
		positions.supprPositionsVaisseau(nomp);
	}

	public List<Partie> getParties() throws TorqueException {
		//renvois la liste de toutes les parties
		PartiePeer parties = null;
		return parties.doSelectAll();
	}

	public Partie getPartie(String nompartie) throws TorqueException {
		//renvois la partie ayant ce nom de partie
		PartiePeer parties = null;
		return parties.getPartie(nompartie);
	}
	
	public Vaisseau getVaisseau(String nomv) throws TorqueException {
		VaisseauPeer vaisseaux = new VaisseauPeer();
		return vaisseaux.getVaisseau(nomv);
	}
	
	public List<Vaisseau> getVaisseaux() throws TorqueException {
		//renvois la liste de tous les vaisseaux
		VaisseauPeer vaisseaux = null;
		return vaisseaux.doSelectAll();
	}
	
	public List<Positionvaisseau> getPositionsVaisseau() throws TorqueException {
		PositionvaisseauPeer positionsVaisseaux = null;
		return positionsVaisseaux.doSelectAll();
	}
	
	public void lancerVueMenuJeu() throws Exception {
		VueMenuJeu vMenuJeu = new VueMenuJeu(this);
	}

	public void lancerVueJeu(Integer nbLignes, Integer nbColones, Vaisseau v1, Vaisseau v2) throws Exception {
		Echiquier e1 = new Echiquier();
		Positionvaisseau posVaisseau1= new Positionvaisseau(),posVaisseau2= new Positionvaisseau();
		e1.setX(nbLignes);
		e1.setY(nbColones);
		Partie p1 = new Partie();
		e1.setIdechiquier(this.getLastId());
		List<Objet> objets = null;
		VueJeu vJeu = new VueJeu(this, p1, e1, posVaisseau1, posVaisseau2, null, null, objets);
	}
	
	private int getLastId() throws TorqueException {
		EchiquierPeer echiquiers = new EchiquierPeer();
		List<Echiquier> listEchiquiers = echiquiers.doSelectAll();
		Integer maxId = 0;
		Iterator<Echiquier> itr = listEchiquiers.iterator();
		while(itr.hasNext()){
			Integer currentId = itr.next().getIdechiquier();
			if (currentId>maxId){
				maxId=currentId;
			}
		}
		return maxId;
	}

	public void lancerVueLancementJeu() throws Exception {
		VueLancementJeu vLancementJeu = new VueLancementJeu(this);
	}

	public void lancerVueCreationVaisseau() throws Exception {
		VueCreationVaisseau vCreaVaisseau = new VueCreationVaisseau(this);
	}
	
	public void lancerVueChargementPartie() throws TorqueException {
		VueChargementPartie vChargPartie = new VueChargementPartie(this);
	}

	public void fermerVue(Vue vueAFermer) {
		vueAFermer.dispose();
	}

	public void lancerVueSuppressionVaisseau() throws Exception {
		VueSuppressionVaisseau vSupprVaisseau = new VueSuppressionVaisseau(this);
		
	}

	public void lancerVueSuppressionPartie() throws TorqueException {
		VueSuppressionPartie vSupprPartie = new VueSuppressionPartie(this);
	}
	
	public void lancerPartieSauvee(Partie partieAjoute) throws Exception {
		List<Echiquier> echiquiers = partieAjoute.getEcheqparties();
		PositionvaisseauPeer vaisseauxPositionnes = new PositionvaisseauPeer();
		List<Positionvaisseau> vaisseaux = vaisseauxPositionnes.getVaisseauxPartie(partieAjoute.getNomp());
		List<Objet> objets = null;
		Inventaire inv1 = null;
		Inventaire inv2 = null;
		// TODO Récupérer positionObjets et positionvaisseaux a ajouter dans la vue Jeu. 
		VueJeu vJeu = new VueJeu(this, partieAjoute, echiquiers.get(getLastId()), vaisseaux.get(0), vaisseaux.get(getLastId()), inv1, inv2, objets);
	}

	public void ExitProgramme() {
		// Arret propre du programme
		System.exit(0);
	}

	public void lancerVueChoixVaisseau(VueLancementJeu vueLancementJeu, boolean b) throws TorqueException {
		VueChoixVaisseau vChoixVaisseau = new VueChoixVaisseau(this,vueLancementJeu,b);		
	}

	public void lancerVueMenuInter(VueJeu vJeu) {
		VueMenuInter vMenuInter = new VueMenuInter(this, vJeu);
	}

	public void sauvPositionVaisseaux(Vector<Positionvaisseau> positionsVaisseaux) throws Exception {
		Iterator itr = positionsVaisseaux.iterator();
		while(itr.hasNext()){
			Positionvaisseau pv = (Positionvaisseau)itr.next();
			pv.save();
		}
	}
	
	public void sauvPositionObjets(Vector<Positionobjet> positionsObjets) throws Exception{
		Iterator itr = positionsObjets.iterator();
		while(itr.hasNext()){
			Positionobjet po = (Positionobjet)itr.next();
			po.save();
		}
	}

	public void sauvPartie(Partie partieCourante) throws Exception {
		partieCourante.save();		
	}

	public String getNomAleatoireObjet() throws TorqueException {
		ObjetPeer objets = new ObjetPeer();
		List<Objet> objetsSelect = objets.doSelectAll();
		Integer nbObjets = objetsSelect.size();
		Objet objetAleatoire = new Objet();
		objetAleatoire.setNomo("plop");
		if(objetsSelect.size()!=0){
			Integer nombreAleatoire = (int) (Math.random()*nbObjets); 
			objetAleatoire = objetsSelect.get(nombreAleatoire);
		}
		return objetAleatoire.getNomo();
	}

//	public void ajouterObjetVaisseau(Positionvaisseau pv1, Positionobjet obj1) {
//		
//	}
}
